// 给所有的函数添加一个 hybind 方法
/**
 * @param {any} thisArg // 需要绑定的 this
 * @param {any} args // 通过 ...args 接收不定量参数
 * @return {any}
 */
Function.prototype.hybind = function(thisArg, ...args) {
  console.log("hybind被调用了")
  // 1.这里需要获取需要改变 this 指向的函数(foo)
  var fn = this

  // 2. 对 thisArg 转正对象类型(防止传入的是非对象类型, 传入为 null, undefined 时，绑定 window)
  thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window

  function proxyFn(...argArray) {
    // 3. 将函数放到 thisArg 中调用
    thisArg.fn = fn
    // 对两个地方传入的参数进行合并
    var finalArgs = [...args, ...argArray]
    var res = thisArg.fn(...finalArgs)
    delete thisArg.fn

    // 4. 返回结果
    return res
  }

  // 把新函数返回
  return proxyFn
}

function foo() {
  console.log('执行 foo 函数', this);
}

let newFoo = foo.hybind({})
newFoo()